Skip to content

fix: support swift.org Swift 6.3 toolchains - #216

Merged
chattymin merged 2 commits into
chattymin:mainfrom
vietlubu:fix/swift-6.3-toolchain
Aug 22, 2026
Merged

chattymin merged 2 commits into
chattymin:mainfrom
vietlubu:fix/swift-6.3-toolchain

Conversation

@vietlubu

Copy link
Copy Markdown
Contributor

Summary

Support building and testing PokeTokenBar with the swift.org/Homebrew Swift 6.3 toolchain
without changing runtime UI behavior.

  • Mark SwiftUI App and View boundaries as @MainActor for Swift 6.3's stricter
    isolation checks.
  • Add a source-level regression test for new SwiftUI boundaries.
  • Resolve llvm-cov from the active Swift toolchain so coverage profiles are read by a
    compatible LLVM version.
  • Import Darwin with @preconcurrency in the opt-in Codex memory performance test.

Type of change

  • Bug fix
  • New feature
  • Refactor / cleanup
  • Documentation
  • Other:

UI changes

Before After
No visual change No visual change; actor annotations only

Checklist

  • swift build and swift test pass locally
  • PR title and description are written in English
  • UI changes are described above (before/after — images optional)
  • No copyrighted assets, secrets, or private tooling references are committed
  • Tests were added or updated for this change

@vietlubu vietlubu mentioned this pull request Aug 22, 2026
8 of 10 tasks
@chattymin
chattymin merged commit fe31abf into chattymin:main Aug 22, 2026
2 checks passed
@chattymin

Copy link
Copy Markdown
Owner

Thank you for your contribution!

@vietlubu
vietlubu deleted the fix/swift-6.3-toolchain branch August 22, 2026 14:25
cte13 pushed a commit to cte13/PokeTokenBar-iOS that referenced this pull request Aug 23, 2026
Brings in upstream features and integrates them with the fork's iOS/OpenCode Go work:
- Antigravity 2.0 / IDE official rate-limit tracking (chattymin#210, chattymin#219, chattymin#220)
- French (fr) UI language (chattymin#185) — added fr strings to fork-only labels
- Per-provider additional scan folders (chattymin#177/chattymin#187)
- Account-labeled official limits (chattymin#199), swift.org Swift 6.3 toolchains (chattymin#216),
  claude-fable-5 pricing (chattymin#198)

Conflicts resolved in Localization, UsageStore, PopoverView, and their tests by
keeping both the fork's OpenCode Go limits and upstream's Antigravity limits, and
by giving fork-only localized labels their French values.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
LeeTaek added a commit to LeeTaek/PokeTokenBar that referenced this pull request Aug 24, 2026
Resolves conflicts with three changes that landed after this branch was cut.

**French (chattymin#185) and Brazilian Portuguese (chattymin#215) UI languages.** `L.t(...)` now
takes six arguments, so every Pokédex-entry string here gains `fr` and `pt`
values. `AppLanguage.apiCodes` keeps the new `.fr`/`.pt` cases and applies this
branch's lowercase `ja-hrkt` fix to `.ja`. `PokeAPIClient.langCodes` keeps the
"union of apiCodes" invariant that chattymin#215 documented — the dead `"ja-Hrkt"` entry
is corrected in place rather than dropped, so the lockstep rule still holds.

**Representative Pokémon (chattymin#158)** was built on the cell-selection model this
branch removes: a tap selected a cell and the footer offered a pin action. With
taps now opening the detail view there is no selection to hang it on, so the
action moves to the detail header, next to the shiny toggle — a species-level
action on the species screen. That also frees the 332pt footer row, which
`RepresentativeToggleLayoutTests` documents as too tight for the pin action plus
species text in longer locales. The cell keeps the representative accent
background (state, not action); the selection highlight is gone with selection
itself. `RepresentativeFooterButton` is renamed to `RepresentativeToggleButton`
since it no longer lives in a footer.

**Swift 6.3 SwiftUI isolation guard (chattymin#216).** The new views here get explicit
`@MainActor`. `FlavorCacheKey` is split across lines because the guard matches
`": App"` as a substring and a one-line `let language: AppLanguage` tripped it.

Portuguese also motivated a behavior change agreed for this branch: PokéAPI has
no `pt` language at all, so a language whose entry list comes back completely
empty now falls back to English with an on-screen notice. Per-version gaps still
drop out silently — only a wholly empty language falls back, and English itself
never does.
donky-ey added a commit to donky-ey/PokeDexBar that referenced this pull request Oct 16, 2026
…c and plan (SP4 batch A) (#20)

* docs: add SP4 upstream port triage spec

Classify all 191 non-merge commits in main..upstream/main (v2.5.6, 77f789d):
56 already in the fork, 87 not applicable, 26 port candidates grouped into
batches A-H, 22 needing a user decision (new providers, small UX features,
save backups). Also checks open upstream issues chattymin#337, chattymin#443 and chattymin#439 against
the fork's code; all three apply.

* docs: record the confirmed SP4 scope in the spec

The user confirmed the triage recommendations: new providers, the pet size
ceiling, variable menu-bar width, the Low Power GIF policy and save backups
stay out; the right-click menu (chattymin#373) joins batch E; chattymin#337 and chattymin#443 are in,
with chattymin#443 skipping claude-code mirror rows unconditionally. chattymin#216 is deferred.

* docs: add the SP4 upstream port plan

Eight batches (A-H), one PR each, executed A -> D -> G -> B -> C -> E -> F -> H.

* fix: isolate every app-support store from test runs (upstream chattymin#359)

`swift test` uses the same storage name as the installed app, so any code
that reached a store's default path read or wrote the user's real
Application Support folder. Upstream chattymin#359 measured usage-cache.json being
rewritten by one suite run. A sweep found the same class in more places:
the sprite cache (a test wrote fake GIFs into it), and the save,
base-index.json and weather.json, which were safe only because every test
happened to inject a path.

Instead of gating each store, isolate at the root: for non-bundled runs
AppEnv.supportDirectory() returns a per-process temporary folder, and
every Application Support path now goes through it. The session-key store
already did this on its own and now shares the root. AppEnv.userSupportDirectory
names the real location for comparisons without creating it.

Guards: AppStorageIsolationTests pins the root branch, each store's default
path, and a source scan that forbids composing Application Support paths
outside AppEnv. All three fail when the isolation branch is reverted. The
upstream regression test is ported as testDefaultPathCacheNeverRewritesTheUserFile.
The screenshot generator clones the installed app's sprite cache read-only
into the isolated cache so its renders still have sprites.

CLAUDE.md: the test-storage rule now covers all app storage, not only
credentials.

* test: pin the locale when asserting grouped numbers (upstream chattymin#166)

TokenFormatter.grouped follows the system region, as macOS does, but the
test hardcoded comma grouping, so it failed on machines whose region groups
digits differently. grouped now takes a locale defaulting to .current
(production unchanged); the test pins en_US and adds an es_ES case that
fails if the argument is ignored.

* test: guard UI sources against Hangul string literals (upstream chattymin#222)

Interpolation tests only see strings that already go through L, so a
literal that never reaches the table is invisible to them. Scan the UI
sources (plus the app entry file, which holds UI copy in this fork) and
fail on any Hangul string literal; Korean comments stay allowed. Core and
Player are left out because their per-language data tables hold Hangul
legitimately. Only the test is ported; the Antigravity notice it shipped
with does not exist here.

* test: check the bundled storage namespace now that test runs are isolated

testEveryStoredPathDerivesFromTheNamespace asserted that the support folder
ends in the storage name, which held only because swift test used the real
folder. Check the bundled path with the pure supportDirectoryURL(isBundledApp:)
and keep the save-under-the-root check for the running process.

* test: stop the seal test from failing on random ciphertext

testPayloadIsNotReadableInTheFile searched the envelope for "42". The seal
uses a fresh AES-GCM nonce each time, so those two characters show up in
the base64 by chance in roughly 1.5% of runs, which failed the gate
intermittently. Assert that the plaintext payload bytes are absent instead.

* fix: tighten the storage-isolation guards and correct their description (review)

- Put @discardableResult back on writeFile. The new tests had been inserted
  between the attribute and the helper, which added 41 unused-result warnings.
- The source scan now also forbids AppEnv.userSupportDirectory outside
  AppEnv.swift. A future store could otherwise reach the real folder through
  the new accessor and pass every guard.
- Comment stripping in the scan walks characters (shared SourceScan, also
  used by LocalizedUILiteralTests), so a "//" inside a string no longer hides
  the rest of the line.
- The isolated folder is named with a UUID instead of the PID. PIDs are
  reused, so a later run could inherit an earlier run's cache.
- Correct the claim in 6b52c9e and CLAUDE.md that all three isolation tests
  fail when the root branch is reverted. Mutation checks show: reverting the
  root fails the root-branch and per-store tests (plus the session-key test);
  the source scan does not react to that, and instead fails when a store
  composes the path itself (the old LocalUsageCache.defaultFileURL, restored)
  or uses userSupportDirectory.

---------

Co-authored-by: 이동기 <ldg0831@midasin.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants